package cn.highedu.coolshark.product.service.impl;

import cn.highedu.coolshark.common.FileUploadException;
import cn.highedu.coolshark.product.service.IUploadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * 文件上传业务类
 */
@Service
@Slf4j
public class UploadServiceImpl implements IUploadService {
    // 定义日期格式 用来创建保存文件的文件夹
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM");
    // 获取上传的目录
    @Value("${upload.location}")
    private File uploadDir;
    /**
     * 上传品牌logo文件
     * @param file 文件
     * @return 文件的访问地址
     */
    @Override
    public String uploadBrandLogo(MultipartFile file) {
        File logoDir = new File(uploadDir, "brand");
        return saveFile(file, logoDir);
    }

    /**
     * 上传商品图片
     * @param file 商品图片
     * @return 图片的访问地址
     */
    @Override
    public String uploadProductImage(MultipartFile file) {
        File imageDir = new File(uploadDir, "product");
        return saveFile(file, imageDir);
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件的Url
     */
    @Override
    public void delete(String fileUrl) {
        log.debug("删除文件: {}", fileUrl);
        // 判断fileUrl是否为空
        if (fileUrl == null || fileUrl.isEmpty()) {
            return;
        }
        // 判断fileUrl是否以"/"开头
        if (!fileUrl.startsWith("/")) {
            return;
        }
        // 获取fileUrl中"/"之后的内容
        String fileName = fileUrl.substring(fileUrl.lastIndexOf("/"));
        // 拼接文件的路径 uploadDir+fileName
        File file = new File(uploadDir, fileName);
        // 判断文件是否存在
        if (!file.exists()) {
            return;
        }
        // 删除文件
        if (file.delete()) {
            log.debug("删除成功");
        }
        else {
            log.debug("删除失败");
        }
    }

    /**
     * 公共的保存文件方法
     * @param file 上传的文件
     * @param logoDir 文件保存的目录
     * @return 文件的访问地址
     */
    private String saveFile(MultipartFile file, File logoDir) {
        String dateDir = LocalDate.now().format(DATE_TIME_FORMATTER);
        File dateDirFile = new File(logoDir, dateDir);
        // 目录不存在 就创建
        if (!dateDirFile.exists()) {
            dateDirFile.mkdirs();
        }
        // 获取原始文件名
        String originalFilename = file.getOriginalFilename();
        // 获取文件的后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 生成新的文件名
        String fileName = UUID.randomUUID() + suffix;
        // 保存文件
        File dest = new File(dateDirFile, fileName);
        try {
            file.transferTo(dest);
            // 返回文件的访问地址
            return "/" + logoDir.getName() + "/" + dateDir + "/" + fileName;
        } catch (IOException e) {
            log.error("保存文件失败", e);
            throw new FileUploadException("文件保存失败");
        }
    }

    /**
     * 上传管理员头像
     * @param file 头像文件
     */
    @Override
    public String uploadAdminAvatar(MultipartFile file) {
        File avatarDir = new File(uploadDir, "avatar");
        return saveFile(file, avatarDir);
    }
}
